package com.bjpowernode.controller;

import com.bjpowernode.entity.TPermission;
import com.bjpowernode.entity.TUser;
import com.bjpowernode.query.UserQuery;
import com.bjpowernode.result.Result;
import com.bjpowernode.service.PermissionService;
import com.bjpowernode.service.UserService;
import com.bjpowernode.util.LoginInfoUtil;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;

/**
 * 用户控制器
 * 提供与用户相关的API接口，当前主要用于获取登录用户信息
 */
@RestController
public class UserController {
    @Resource
    private UserService userService;
    @Resource
    private PermissionService permissionService;

    /**
     * 获取当前登录用户信息接口
     *
     * @return Result 包含当前登录用户信息的响应对象
     * @apiNote 该接口需要用户已登录，通过JWT令牌进行身份验证
     * @see LoginInfoUtil#getCurrentLoginUser() 用于获取当前登录用户信息的工具类方法
     */
    @GetMapping("/api/login/user")
    public Result getUser() {
        // 从工具类获取当前登录用户信息
        TUser currentLoginUser = LoginInfoUtil.getCurrentLoginUser();
        // 从权限服务获取当前用户的菜单权限列表
        List<TPermission> tMenuPermissionList = permissionService.getPermissionByUserId(currentLoginUser.getId());
        // 设置用户的菜单权限列表
        currentLoginUser.setTMenuPermissionList(tMenuPermissionList);
        // 返回成功响应，包含用户信息
        return Result.OK(currentLoginUser);
    }

    /**
     * 获取用户列表分页数据接口
     *
     * @param current 当前页码，从1开始
     * @return Result 包含分页用户数据的响应对象
     * @apiNote 该接口需要用户具备管理员权限，返回指定页码的用户列表及分页信息
     * @see UserService#getUserByPage(Integer) 用户服务层的分页查询方法
     */
    @GetMapping("/api/users")
    public Result getusers(@RequestParam(value = "current") Integer current) {
        // 调用用户服务获取分页数据
        PageInfo<TUser> pageInfo = userService.getUserByPage(current);
        // 返回成功响应，包含分页信息
        return Result.OK(pageInfo);
    }

    /**
     * 根据用户ID获取用户详情接口
     *
     * @param id 用户ID，路径参数
     * @return Result 包含用户详情数据的响应对象
     * @apiNote 该接口需要用户已登录，根据ID查询并返回单个用户的完整信息
     * @see UserService#getUserById(Integer) 用户服务层的详情查询方法
     */
    @GetMapping("/api/user/{id}")
    public Result getUserById(@PathVariable Integer id) {
        // 调用用户服务根据ID查询用户详情
        TUser tUser = userService.getUserById(id);
        // 返回成功响应，包含用户详情
        return Result.OK(tUser);
    }

    /**
     * 用户注册接口
     *
     * @param userQuery 用户注册信息查询对象，包含用户名、密码等必要信息
     * @return Result 包含影响行数的响应对象，1表示成功，0表示失败
     * @apiNote 该接口无需登录即可访问，用于新用户注册
     * @see UserService#addUser(UserQuery) 用户服务层的添加用户方法
     */
    @PostMapping("/api/user")
    public Result addUser(@Valid UserQuery userQuery) {
        // 调用用户服务添加新用户
        int count = userService.addUser(userQuery);
        // 返回成功响应，包含影响行数
        return count == 1 ? Result.OK(count) : Result.FAIL();
    }

    /**
     * 用户信息编辑接口
     *
     * @param userQuery 用户编辑信息查询对象，包含用户ID及待更新字段
     * @return Result 包含影响行数的响应对象，1表示成功，0表示失败
     * @apiNote 该接口需要登录后访问，用于已注册用户更新个人信息
     * @see UserService#editUser(UserQuery) 用户服务层的编辑用户方法
     */
    @PutMapping("/api/user")
    public Result editUser(UserQuery userQuery) {
        // 调用用户服务编辑用户信息
        int count = userService.editUser(userQuery);
        // 返回成功响应，包含影响行数
        return count == 1 ? Result.OK(count) : Result.FAIL();
    }

    /**
     * 用户删除接口
     *
     * @param id 用户唯一标识符，通过URL路径传递
     * @return Result 包含影响行数的响应对象，1表示成功，0表示失败或用户不存在
     * @apiNote 该接口需要管理员权限才能访问，用于删除指定ID的用户
     * @see UserService#deleteUser(Integer) 用户服务层的删除用户方法
     */
    @DeleteMapping("/api/user/{id}")
    public Result deleteUser(@PathVariable Integer id) {
        // 调用用户服务删除指定ID的用户
        int count = userService.deleteUser(id);
        // 返回成功响应，包含影响行数
        return count == 1 ? Result.OK(count) : Result.FAIL();
    }

    /**
     * 用户批量删除接口
     * 使用DELETE请求方式，请求路径为/api/users
     *
     * @param ids 用户ID字符串，多个ID使用逗号分隔（例如："1,2,3"）
     * @return Result对象，包含以下两种可能结果：
     * - 成功：状态码为成功标识，data字段为删除的用户数量
     * - 失败：状态码为失败标识，无data字段
     */
    @DeleteMapping("/api/users")
    public Result deleteUser(@RequestParam("ids") String ids) {
        // 将逗号分隔的用户ID字符串转换为List集合
        List<String> list = Arrays.asList(ids.split(","));
        // 调用用户服务层批量删除用户，返回实际删除的数量
        int count = userService.deleteUsers(list);
        // 返回成功响应，包含影响行数
        // 如果实际删除数量等于请求删除数量，则返回成功；否则返回失败
        return count == list.size() ? Result.OK(count) : Result.FAIL();
    }

    @GetMapping("/api/owners")
    public Result getOwners() {
        List<TUser> tOwners = userService.getOwners();
        // 返回成功响应，包含用户信息
        return Result.OK(tOwners);
    }
}
